揭露:我在 APIGOTO 團隊工作。APIGOTO 是獨立的 OpenAI 相容 API 閘道,與 OpenAI、Anthropic、Google 無關。下面的寫法適用於任何 OpenAI 相容端點,不限我們家。
原型接上 LLM API 之後,最先遇到的問題通常不是 prompt,而是 429、請求卡住不回、或某個模型暫時不可用。以下是我常用的小封裝,一次處理這三件事。
import os, time
from openai import OpenAI, APIStatusError, APITimeoutError, APIConnectionError
client = OpenAI(
base_url=os.getenv("LLM_BASE_URL", "https://api.china-aiapi.com/v1"),
api_key=os.environ["LLM_API_KEY"],
timeout=30, # 不要無限等待
max_retries=0, # 重試自己控制
)
RETRYABLE = {429, 500, 502, 503, 504}
def chat(messages, models, attempts=3):
last_err = None
for model in models:
for i in range(attempts):
try:
r = client.chat.completions.create(model=model, messages=messages)
return model, r.choices[0].message.content
except APIStatusError as e:
last_err = e
if e.status_code not in RETRYABLE:
break # 400/401/404 重試沒用,直接換下一個模型
except (APITimeoutError, APIConnectionError) as e:
last_err = e
time.sleep(min(2 ** i, 8))
raise RuntimeError(f"all models failed: {last_err}")
model, text = chat(
[{"role": "user", "content": "用一句話解釋 HTTP 429。"}],
models=["your-primary-model", "your-backup-model"],
)
print(model, text)
client.models.list()),不要自己猜。base_url 和金鑰,這段程式可以直接指向 OpenAI、自架服務或任何閘道。想用我們的閘道試試的話,Base URL 是 https://api.china-aiapi.com/v1,按量計費:www.china-aiapi.com。歡迎在留言討論這個寫法的改進。